#ifndef INTERFACES_H_
#define INTERFACES_H_

class FunctionObserver 
{
public:
	virtual void updateFunction(std::string functionLabel, int functionSize) = 0;
};

#include "FunctionEntry.h" 
#include "ThreeAddressCode.h"

class ICodeInterface
{
public:
	virtual void threeAddressCode(attr result, OpCode opCode, int index) =0;
	virtual void threeAddressCode(attr result, OpCode opCode, attr operand) =0;
	virtual void threeAddressCode(attr result, OpCode opCode, attr operand1, attr operand2) =0;
	virtual void threeAddressCode(attr result, OpCode opCode, std::string callLabel, int paramCount) =0;

	virtual void threeAddressCode(std::string label) =0;

	virtual void threeAddressCode(OpCode opCode) =0;
	virtual void threeAddressCode(OpCode opCode, attr operand) =0;
	virtual void threeAddressCode(OpCode opCode, attr operand, std::string gotoLabel) =0;

	virtual void threeAddressCode(OpCode opCode, std::string label) =0;
	virtual void threeAddressCode(OpCode opCode, ParamList* pList) =0;
	
	virtual std::string getNextLabel() =0;
};

class TCodeInterface
{
public:
	virtual bool hasNextTAC() =0;
	virtual const ThreeAddressCode* nextTAC() =0;
	virtual int getFunctionSize(std::string functionLabel) =0;
};

#endif /*INTERFACES_H_*/
